package util;

import java.util.List;

import dominio.neuronio.Neuronio;
import dominio.neuronio.Sinapse;

/**
 * @author Paulo Vitor
 * @author Roberto Su
 * 
 * @description
 *
 *
 */
public class Util {
	
	/**
	 * @param matriz
	 * @return
	 */
	public static double[] matrizParaVetor(double[][] matriz){
		double[] vetor = new double[getQtdeLinhasMatriz(matriz) * getQtdeColunasMatriz(matriz)];
		int countChar = 0;
		for( int i = 0; i < matriz.length; i++ ) {
			double[] ds = matriz[ i ];
			for( int j = 0; j < ds.length; j++ ) {
				double d = ds[ j ];
				vetor[countChar++] = d;
			}
		}
		return vetor;
	}
	
	/**
	 * @param matriz
	 * @return
	 */
	public static int getQtdeLinhasMatriz( double[][] matriz ){
		return (matriz != null ? matriz.length : 0);
	}
	
	/**
	 * @param matriz
	 * @return
	 */
	public static int getQtdeColunasMatriz( double[][] matriz ){
		return (matriz != null && matriz[0] != null ? matriz[0].length : 0);
	}
	
	/**
	 * @param vetor
	 * @return
	 */
	public static double erroQuadratico(double[] vetor){
		double soma = 0;
		for(int i=0; i < vetor.length; i++){
		    soma += Math.pow(vetor[i], 2);
		}
		return soma;	
    }
	
	/**
	 * @param padrao
	 */
	public static void printMatriz( double[][] padrao ){
		for( int i = 0; i < padrao.length; i++ ) {
			double[] ds = padrao[ i ];
			for( int j = 0; j < ds.length; j++ ) {
				double d = ds[ j ];
				System.out.print( (d == -1 ? " " : "#" ) );
			}
			System.out.println();
		}
		System.out.println();
		System.out.println();
	}
	
	/**
	 * @param vetor
	 */
	public static void imprimirVetor(double[] vetor){
		for (int i = 0; i < vetor.length; i++) {
			double d = vetor[i];
			System.out.print( d + "  " );
		}
		System.out.println();
	}
	
	/**
	 * @param n
	 * @return
	 */
	public static double getDistanciaEuclidiana(Neuronio n){
		List<Sinapse> sinapses = n.getSinapses();
		int qtdeSinapses = sinapses.size();
		
		double[] x = new double[qtdeSinapses];
		double[] w = new double[qtdeSinapses];
		
		//cada elemento do vetor ao quadrado
		int i = 0;
		for( Sinapse s : sinapses ) {
			x[i] = Math.pow(s.getEntrada(), 2);
			w[i++] = Math.pow(s.getEntrada(), 2);
		}
		
		double distX = somaVetor( x );
		double distW = somaVetor( w );
		
		distX = Math.pow(distX, 0.5);
		distW = Math.pow(distW, 0.5);
		
		return distX - distW;
	}

	/**
	 * @param vetor
	 * @return
	 */
	public static double somaVetor(double[] vetor){
		double soma = 0.0;
		for( double d : vetor ) {
			soma += d;
		}
		return soma;
	}
	
	/**
	 * @param yK
	 * @return
	 */
	public static int getVencedorCompeticao(double[] yK){
		int indiceVencedor = 0;
		double menorDistancia = yK[0];
		for(int i=0; i<yK.length; i++){
			if(yK[i] < menorDistancia){
				menorDistancia = yK[i];
				indiceVencedor = i;
			}
		}
		return indiceVencedor;
	}
	
}
